package gc;

import java.util.ArrayList;
import java.util.List;

/**
 * 分析GClog
 * 堆区域内存oom
 * @author eii
 * @time 2020/12/24 11:08 下午
 */
public class GcLogHeapOom {
    public static void main(String[] args) {
        long counter = 0;
        List<Object> list = new ArrayList<>();
        while(true){
            list.add(new Object());
            System.out.println("当前创建了第" + ++counter + "个对象");
        }
    }
}
/*
采用的JVM参数如下：
-Xms10m -Xmx10m -XX:+PrintGCDetails -Xloggc:gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=./ -XX:+UseParNewGC -XX:+UseConcMarkSweepGC

-Xms10m
-Xmx10m
-XX:+PrintGCDetails
-Xloggc:gc.log
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=./
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC

1、程序报错崩溃：
java.lang.OutOfMemoryError: Java heap space Dumping heap to ./java_pid1023.hprof ...
Heap dump file created [13409210 bytes in 0.033 secs]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space



2、用MAT分析内存快照

Java堆内存溢出了，而且同时他还给我们导出了一份内存快照。
分析一下MAT给我们的分析报告。
首先看下面的句子：The thread java.lang.Thread @ 0x7bf6a9a98 main keeps local variables with total size 7,203,536 (92.03%) bytes。
意思就是main线程通过局部变量引用了7230536个字节的对象，大概就是7MB左右
考虑到我们总共就给堆内存10MB，所以7MB基本上个已经到极限了，是差不多的。
接着看
The memory is accumulated in one instance of "java.lang.Object[]" loaded by "<system class loader>"
这句话的意思就是内存都被一个实例对象占用了，就是java.lang.Object[]

点击See stacktrace，可以看到调用栈

调用栈，其实说的很明显了，在Demo3.main()方法中，一直在调用ArrayList.add()方法，然后此时直接引发了内存溢出。所以我们只要在对应代码里看一下，立马就知道怎么回事


 */
